package logger

import (
	"os"
	"path/filepath"
	"sync/atomic"
	"unsafe"
)

// 日志文件配置(如果没有传入新的日志文件配置则使用默认的NewLogFileConfig())
type LogFileConfig struct {
	LogFileName        string   //日志文件名字
	LogFilePath        string   //日志文件路径
	LogFileLevel       logLevel //日志文件等级
	LogFileMaxLine     int      //单个日志文件最大行数
	LogFileMaxNumber   int      //日志文件最大编号(如果为0则不会每个生成间隔内只会产生一个带日期后缀的日志文件,日志文件达到最大行数则不会再写日志)
	LogFileMaxSaveDays int      //日志文件最大保存天数(<1:永久保存 >=1:第二天0点删除 ... 以此类推)
	Keys               []string //Debug时可以输入的Key

	AppendFileInfo bool //是否增加文件信息
	TrimFilePath   bool //是否去除文件的路径
	// AppendFuncInfo  bool //是否增加函数信息
	// TrimPackagePath bool //是否去除  包的路径
}

func (cfg *LogFileConfig) GetAtomicFileLevel() logLevel {
	val := atomic.LoadInt64((*int64)(unsafe.Pointer(&logGlobal.config.LogFileLevel)))
	return logLevel(val)
}

var defaultLogConfig = &LogFileConfig{
	LogFileName:        "default",
	LogFilePath:        "./log/",
	LogFileLevel:       LogLevelDebug,
	LogFileMaxLine:     200000,
	LogFileMaxNumber:   2000,
	LogFileMaxSaveDays: 3,
	Keys:               []string{LogKey_Default},
	AppendFileInfo:     true,
	// AppendFuncInfo:     true,
	TrimFilePath: true,
	// TrimPackagePath:    true,
}

// 生成一个默认的日志文件
func GenLogConfigFile(cfgpath string) {
	if filepath.Ext(cfgpath) == ".toml" {
		if _, err := os.Stat(cfgpath); os.IsNotExist(err) {
			f, _ := os.Create(cfgpath)
			f.WriteString(logfile)
			f.Close()
			//没有对应的log.toml文件
			// toml.DecodeFile(cfgpath, defaultLogConfig)
		}
	}
}

const (
	logfile = `
# 文件保存路劲
LogFilePath = "../log/"
# 0 致命等级(输出致命日志)一般是未知错误,发生了里发报警
# 1 错误等级(输出错误日志)一般是已知错误,发生了需要处理
# 2 警告等级一般是配置表有错,但不影响正常运行等
# 3 信息等级上线后正常需要看到的日志,报告状态等
# 4 调试等级上线后不需要看到的日志,调试用,可以使用Key来临时开关的日志
# 只会输入小于等于LogFileLevel设置值的等级日志
LogFileLevel = 4
# 单个日志文件最大行数
LogFileMaxLine = 200000
# 日志文件最大编号
# (如果为0则不会每个生成间隔内只会产生一个带日期后缀的日志文件,
# 日志文件达到最大行数则不会再写日志)
LogFileMaxNumber = 2000
# 日志文件最大保存天数(<1:永久保存 >=1:第二天0点删除 ... 以此类推)
LogFileMaxSaveDays = 3
# 日志为调试等级（Debug）时，
# 下面标注的Key才会被输出
# 可以根据需要自己在上面加
Keys = [    
    "Default", # 缺省调试日志
    # "Entity", # Entity有关的调试信息
	# "Mysql", # Mysql有关日志
	# "Redis", # redis有关日志
	# "Gin", # 使用Gin库的http服务，gin库内的有关日志
	# "MoveSys", # 移动
	# "PlayerMoveSys", # 角色移动
	# "LoginFlow", # 登录流程
	# "Mail", # 邮件
	# "Space", # zeus.space包
	# "Msg", # 消息处理接口相关日志
	# "AOI", # AOI相关日志
	# "Interact", # 交互物相关日志
	# "Instance", # 副本相关日志
	# "Team", # 组队相关日志
	# "Amulete", # 符文相关
	# "EffLine", # 效果线
	# "RingTask", # 环任务
	# "Auction", # 拍卖行相关日志
	# "Guild", # 公会相关日志
	# "SceneLogin", # 场景登录流程
]
`
)
